package com.jishuo.pzk.service;

import com.github.pagehelper.PageHelper;
import com.jishuo.base.bean.Pagination;
import com.jishuo.pzk.bean.base.*;
import com.jishuo.pzk.bean.dto.SelectReq;
import com.jishuo.pzk.dao.VoucherMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 凭证数据服务
 */
@Service
public class VoucherService {
    @Resource
    private VoucherMapper voucherMapper;

    @Value("${pzk.sender}")
    private String sender;

    private Map<String, VoucherTypeVO> voucherTypeMap;
    private List<VouTempPageVO> vouPageList;
    private VouSealVO vouSealVO;
    private List<VouandSealVO> vouandSealList;

    public List<VouTempPageVO> listVouPage() {
        if (vouPageList == null) {
            vouPageList = voucherMapper.listVouPage();
        }
        return vouPageList;
    }

    public VouSealVO getVouSeal() {
        if (vouSealVO == null) {
            vouSealVO = voucherMapper.getVouSeal(sender);
        }
        return vouSealVO;
    }

    public List<VouandSealVO> listVouandSeal() {
        if (vouandSealList == null) {
            vouandSealList = voucherMapper.listVouandSeal();
        }
        return vouandSealList;
    }

    /**
     * 获得凭证类型
     * @param vocode 编码
     * @return
     */
    public VoucherTypeVO getVoucherType(String vocode) {
        if (voucherTypeMap == null) {
            List<VoucherTypeVO> list = voucherMapper.listVoucherType();
            voucherTypeMap = new HashMap<>();
            for (VoucherTypeVO vo : list) {
                voucherTypeMap.put(vo.getVoCode(), vo);
            }
        }
        return voucherTypeMap.get(vocode);
    }

    /**
     * 获得凭证模板页
     * @param vocode 编码
     * @param page 页码
     * @return
     */
    public VouTempPageVO getVouTempPage(String vocode, int page) {
        return voucherMapper.getVouTempPage(vocode, page);
    }

    /**
     * 保存凭证
     * @param voucher
     * @return 执行结果
     */
    public int saveVoucher(VoucherVO voucher) {
        // 查询重复数据
        VoucherVO vo = voucherMapper.findVoucher(voucher);
        if (vo != null) {
//            // 根据sn删除之前添加过T_FSVOUCHER_DETAIL表里的数据
//            baseDataMapper.deleteVoucherDetail(vo.getVoSn());
            // 修改凭证主表状态为4
            voucherMapper.updateIsenable(vo.getVoSn());
        }
        return voucherMapper.insertVoucher(voucher);
    }

    /**
     * 保存字段
     * @param listDe
     * @return
     */
    public int saveVoucherDetail(List<VoucherDetailVO> listDe) {
        return voucherMapper.saveVoucherDetail(listDe);
    }

    List<VouFieldVO> getVouField(String pageId) {
        return voucherMapper.getVouField(pageId);
    }

    /**
     * 保存凭证文件信息。
     *
     * @param vo VoucherFileVO对象，包含凭证文件的详细信息。
     * @return 返回操作结果，如果凭证文件不存在则插入并返回插入的行数，如果存在则更新并返回更新的行数。
     */
    public int saveVoucherFile(VoucherFileVO vo) {
        // 检查是否已存在相同的凭证文件，若不存在则插入，存在则更新
        List<VoucherFileVO> list = voucherMapper.findVoucherFile(vo.getBusiorderno(), vo.getVoSn(), vo.getVfId());
        if (list.isEmpty()) {
            return voucherMapper.insertVoucherFile(vo);
        } else {
            return voucherMapper.updateVoucherFile(vo);
        }
    }

    /**
     * 根据条件查询凭证信息并支持分页。
     *
     * @param req 包含查询条件的请求对象。
     * @param pagination 包含分页信息的对象，如当前页码和每页显示的条数。
     * @return 返回一个凭证信息的列表。
     */
    public List<VoucherVO> selectVoucher(SelectReq req, Pagination pagination) {
        // 当单页条数大于零时，启用分页
        if (pagination.getRows() > 0) PageHelper.startPage(pagination.getPage(), pagination.getRows());
        return voucherMapper.selectVoucher(req);
    }

    /**
     * 根据传入的凭证编号和子编号查询凭证文件信息。
     *
     * @param req 包含凭证编号和子编号的请求对象。
     * @return 返回一个凭证文件信息的列表。
     */
    public List<VoucherFileVO> findVoucherFile(SelectReq req) {
        return voucherMapper.findVoucherFile(req.getBillNum(), req.getVoSn(),"");
    }

    public List<VoucherTypeVO> selectVoucherType() {
        return voucherMapper.selectVoucherType();
    }

    public VoucherVO findVoucher(String biliNum, Integer type) {
        return voucherMapper.findVoucherVO(biliNum, type);
    }

    public int updateVoucherIsEnableThree(String biliNum, String type, String sn) {
        return voucherMapper.updateVoucherIsEnableThree(biliNum, type, sn);
    }
}
